#include <stdio.h>
int n, m, task_count[51];
int main() {
  scanf("%d %d", &n, &m);
  for (int i = 0; i < n; i++) {
    int j;
    scanf("%d", &j); // 读入每个任务的级别到j
    task_count[j]++; // 用task_count统计不同级别的任务的数量
  }

  // total_time代表所有任务的总耗时, tmp代表当前级别的单个任务耗时,
  // 1代表0级别耗时1单位
  long long total_time = 0, tmp = 1;
  for (int i = 0; i < 51; i++) { // 对50个级别扫描累计
    total_time += task_count[i] * tmp; // 总耗时累加当前级别耗时*当前级别任务数
    tmp += tmp;                        // 到下一级别耗时翻倍
  }

  // task_time代表当前级别耗时, 级别由50级开始倒数, 所以初始值为2^50,
  // need_time代表所有机器并行总耗时, 为每级别累加, 所以初始值为0
  long long task_time = 1LL << 50, need_time = 0;
  for (int i = 50; i >= 0; i--) { // 从50级开始往下计算
    int j = task_count[i] / m,
        k = task_count[i] - j * m; // j代表当前级别任务数量m台机器运行轮数,
                                   // k代表还剩余不足一轮的任务数量
    long long work_time = task_time * j; // work_time代表运行j轮的总时间
    total_time -= work_time * m; // 从总任务量中, 扣去m台机器j轮运行完成的工作量
    need_time += work_time; // 在总用时上,累加j轮运行的总时间
    if (k) {                // 如果还剩下不足一轮的工作量
      if (total_time <=
          task_time * m) { // 如果剩下的工作总量,已不足填满当前一整轮
        need_time += task_time; // 总工作时间至少要再运行一个当前级别的任务时间,
                                // 因为还有k个当前级别任务
        break; // 当前轮次执行完, 所有任务必定完成,所以退出循环
      }
      task_count[i - 1] +=
          k *
          2; // 如果工作量足以填满本轮,
             // 将当前剩余k个任务拆分为双倍的下一级别任务, 并入下一级别一同计算
    }
    task_time >>= 1; // 下一级别的工作时间减半
  }
  printf("%lld\n", need_time); // 输出总用时
  return 0;
}